跳到主要内容

聚类算法案例一 例题9.4

9.4 试编程实现k均值算法,设置三组不同的k值、三组不同初始中心点,在西瓜数据集4.0上进行试验比较,并讨论什么样的初始中心有利于取得好结果。k-means流程.png 第一部分:CSV上传,上传CSV数据文件,这里数据用的是西瓜数据集4.0.
这是一个包含密度与含糖率两个属性值的二维向量。

Number(编号),density(密度),sugercontent(含糖率)

第二部分:直接使用k均值聚类(k-means)模块,同时输入聚类簇数。

k均值算法介绍:
给定样本集D,k-means算法(k均值算法)通过迭代优化针对聚类所得簇划分C最小化平方误差E,E镖师簇内样本围绕簇均值向量的紧密程度,E越小簇内样本相似度越高。这是一种基于划分的聚类算法,计算量大,但很容易发现数据库中的球状簇。

计算流程:
输入:样本集D;聚类簇数k。
过程:1初始化:从D中随机选取k个样本作为初始均值向量,
2簇划分:计算各个样本与各均值向量的距离,根据距离最近的均值向量确定各个样本的簇标记,然后将各个样本划入相应的簇。
3均值向量迭代更新:计算新的均值向量,重复划分样本的操作。
若迭代更新后聚类结果保持不变,
输出:簇划分C。

第三部分:模型预测,将待预测数据和经过k-means算法训练后的数据进行模型预测。

第四部分:用VS code Python模块将输出结果可视化。
完成前面模块的运行后,运行该节点,勾选编辑,点击编辑操作编辑VS code ,进入编辑页面。

主函数:

# coding=utf-8
from __future__ import absolute_import, print_function
import pandas as pd
import suanpan
#from suanpan.docker import DockerComponent as dc
from suanpan.app import app
from suanpan.app.arguments import Folder,File
#from suanpan.docker.arguments import Folder,File
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt


# 定义输入
#@dc.input(Folder(key="inputData1", required=True))
@app.input(Folder(key="inputData1", required=True))
# 定义输出
#@dc.output(File(key="outputData1",type='png',name='picture',required=True))
@app.output(File(key="outputData1",type='png',name='picture',required=True))
def Demo(context):
# 从 Context 中获取相关数据
args = context.args
# 查看上一节点发送的 args.inputData1 数据
#print(args.inputData1)
data=pd.read_csv(args.inputData1+'/data.csv')
#print(data1)
data1=data.drop(['number','prediction'],axis=1)
#data2=data1.drop(['prediction'],axis=1)
#print(data1)
#plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
#plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#不同类别用不同颜色和样式绘图
d = data1[data['prediction'] == 0]
plt.plot(d['density'],d['sugercontent'], 'r.')
d = data1[data['prediction'] == 1]
plt.plot(d['density'],d['sugercontent'], 'go')

#plt.show()
plt.savefig("picture.png")

return "picture.png"



if __name__ == "__main__":
suanpan.run(Demo)

需求:
matplotlib
完成编辑,运行,查看结果。
K=2 image.png K=3 image.png K=4
 image.png  
Tips:初始随机的中心点不同会导致算法的迭代次数与最终结果有很大的不同。
一般来说,初始的中心点越集中且越靠近边缘,则会使得迭代次数更多。初始中心点越分散,迭代次数越少,结果越好。